from flask import Flask, session, g
from flask_migrate import Migrate

import config
from exts import db

from blueprints.AuthViews import bp as auth_bp
from blueprints.BooksView import bp as books_bp
from blueprints.BookTypeViews import bp as book_type_bp

from models.BookSystemModels import UserModel
from flask_cors import CORS

app = Flask(__name__)
# 注册过滤器
# app.add_template_filter()

# 基础配置（数据库，文件上传）
app.config.from_object(config)

# 初始化数据库
db.init_app(app)

# 注册蓝图
app.register_blueprint(auth_bp)
app.register_blueprint(books_bp)
app.register_blueprint(book_type_bp)

# 数据模型迁移 flask_migrate
migrate = Migrate(app, db)

# 使用：
# flask db init  只执行一次
# flask db migrate  生成迁移脚本
# flask db upgrade  同步到数据库

# 解决跨域（前后端分离）
# 允许特定的源并支持凭证
# CORS(app, origins=["http://localhost:8085"], supports_credentials=True)
CORS(app, resources=r'/*', supports_credentials=True, expose_headers=["Content-Disposition"])


# 钩子函数，hooks
# @app.before_request装饰器：在每次请求之前执行
# @app.context_processor装饰器：添加全局变量，上下文对象处理器（在任何文件中都可获取其中的数据）
@app.before_request
def my_before_request():
    # 可以通过路径方式来达到拦截器作用
    # request_url = request.url
    # if request_url.startswith("/auth/loginGet"):
    #     return
    user_id = session.get("user_id")
    if user_id:
        user = UserModel.query.get(user_id)
        setattr(g, "user", user)
    else:
        setattr(g, "user", None)
        # return fail_json_result(msg="用户未登录,请先登录")


@app.context_processor
def my_context_processor():
    return {"user": g.user}


if __name__ == '__main__':
    # host="0.0.0.0": 信任的网络或当前网络下所有计算机都可访问，否则只能自己访问
    app.run(host="0.0.0.0", port=30010, debug=True)
